home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / JpegImagePlugin.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  11.5 KB  |  363 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. __version__ = '0.5'
  5. import array
  6. import string
  7. import Image
  8. import ImageFile
  9.  
  10. def i16(c, o = 0):
  11.     return ord(c[o + 1]) + (ord(c[o]) << 8)
  12.  
  13.  
  14. def i32(c, o = 0):
  15.     return ord(c[o + 3]) + (ord(c[o + 2]) << 8) + (ord(c[o + 1]) << 16) + (ord(c[o]) << 24)
  16.  
  17.  
  18. def Skip(self, marker):
  19.     n = i16(self.fp.read(2)) - 2
  20.     ImageFile._safe_read(self.fp, n)
  21.  
  22.  
  23. def APP(self, marker):
  24.     n = i16(self.fp.read(2)) - 2
  25.     s = ImageFile._safe_read(self.fp, n)
  26.     app = 'APP%d' % (marker & 15)
  27.     self.app[app] = s
  28.     self.applist.append((app, s))
  29.     if marker == 65504 and s[:4] == 'JFIF':
  30.         self.info['jfif'] = version = i16(s, 5)
  31.         self.info['jfif_version'] = divmod(version, 256)
  32.         
  33.         try:
  34.             jfif_unit = ord(s[7])
  35.             jfif_density = (i16(s, 8), i16(s, 10))
  36.         except:
  37.             pass
  38.  
  39.         if jfif_unit == 1:
  40.             self.info['dpi'] = jfif_density
  41.         
  42.         self.info['jfif_unit'] = jfif_unit
  43.         self.info['jfif_density'] = jfif_density
  44.     elif marker == 65505 and s[:5] == 'Exif\x00':
  45.         self.info['exif'] = s
  46.     elif marker == 65506 and s[:5] == 'FPXR\x00':
  47.         self.info['flashpix'] = s
  48.     elif marker == 65518 and s[:5] == 'Adobe':
  49.         self.info['adobe'] = i16(s, 5)
  50.         
  51.         try:
  52.             adobe_transform = ord(s[1])
  53.         except:
  54.             pass
  55.  
  56.         self.info['adobe_transform'] = adobe_transform
  57.     
  58.  
  59.  
  60. def COM(self, marker):
  61.     n = i16(self.fp.read(2)) - 2
  62.     s = ImageFile._safe_read(self.fp, n)
  63.     self.app['COM'] = s
  64.     self.applist.append(('COM', s))
  65.  
  66.  
  67. def SOF(self, marker):
  68.     n = i16(self.fp.read(2)) - 2
  69.     s = ImageFile._safe_read(self.fp, n)
  70.     self.size = (i16(s[3:]), i16(s[1:]))
  71.     self.bits = ord(s[0])
  72.     if self.bits != 8:
  73.         raise SyntaxError('cannot handle %d-bit layers' % self.bits)
  74.     
  75.     self.layers = ord(s[5])
  76.     if self.layers == 1:
  77.         self.mode = 'L'
  78.     elif self.layers == 3:
  79.         self.mode = 'RGB'
  80.     elif self.layers == 4:
  81.         self.mode = 'CMYK'
  82.     else:
  83.         raise SyntaxError('cannot handle %d-layer images' % self.layers)
  84.     if marker in [
  85.         65474,
  86.         65478,
  87.         65482,
  88.         65486]:
  89.         self.info['progression'] = 1
  90.     
  91.     for i in range(6, len(s), 3):
  92.         t = s[i:i + 3]
  93.         self.layer.append((t[0], ord(t[1]) / 16, ord(t[1]) & 15, ord(t[2])))
  94.     
  95.  
  96.  
  97. def DQT(self, marker):
  98.     n = i16(self.fp.read(2)) - 2
  99.     s = ImageFile._safe_read(self.fp, n)
  100.     while len(s):
  101.         if len(s) < 65:
  102.             raise SyntaxError('bad quantization table marker')
  103.         
  104.         v = ord(s[0])
  105.         if v / 16 == 0:
  106.             self.quantization[v & 15] = array.array('b', s[1:65])
  107.             s = s[65:]
  108.             continue
  109.         return None
  110.  
  111. MARKER = {
  112.     65472: ('SOF0', 'Baseline DCT', SOF),
  113.     65473: ('SOF1', 'Extended Sequential DCT', SOF),
  114.     65474: ('SOF2', 'Progressive DCT', SOF),
  115.     65475: ('SOF3', 'Spatial lossless', SOF),
  116.     65476: ('DHT', 'Define Huffman table', Skip),
  117.     65477: ('SOF5', 'Differential sequential DCT', SOF),
  118.     65478: ('SOF6', 'Differential progressive DCT', SOF),
  119.     65479: ('SOF7', 'Differential spatial', SOF),
  120.     65480: ('JPG', 'Extension', None),
  121.     65481: ('SOF9', 'Extended sequential DCT (AC)', SOF),
  122.     65482: ('SOF10', 'Progressive DCT (AC)', SOF),
  123.     65483: ('SOF11', 'Spatial lossless DCT (AC)', SOF),
  124.     65484: ('DAC', 'Define arithmetic coding conditioning', Skip),
  125.     65485: ('SOF13', 'Differential sequential DCT (AC)', SOF),
  126.     65486: ('SOF14', 'Differential progressive DCT (AC)', SOF),
  127.     65487: ('SOF15', 'Differential spatial (AC)', SOF),
  128.     65488: ('RST0', 'Restart 0', None),
  129.     65489: ('RST1', 'Restart 1', None),
  130.     65490: ('RST2', 'Restart 2', None),
  131.     65491: ('RST3', 'Restart 3', None),
  132.     65492: ('RST4', 'Restart 4', None),
  133.     65493: ('RST5', 'Restart 5', None),
  134.     65494: ('RST6', 'Restart 6', None),
  135.     65495: ('RST7', 'Restart 7', None),
  136.     65496: ('SOI', 'Start of image', None),
  137.     65497: ('EOI', 'End of image', None),
  138.     65498: ('SOS', 'Start of scan', Skip),
  139.     65499: ('DQT', 'Define quantization table', DQT),
  140.     65500: ('DNL', 'Define number of lines', Skip),
  141.     65501: ('DRI', 'Define restart interval', Skip),
  142.     65502: ('DHP', 'Define hierarchical progression', SOF),
  143.     65503: ('EXP', 'Expand reference component', Skip),
  144.     65504: ('APP0', 'Application segment 0', APP),
  145.     65505: ('APP1', 'Application segment 1', APP),
  146.     65506: ('APP2', 'Application segment 2', APP),
  147.     65507: ('APP3', 'Application segment 3', APP),
  148.     65508: ('APP4', 'Application segment 4', APP),
  149.     65509: ('APP5', 'Application segment 5', APP),
  150.     65510: ('APP6', 'Application segment 6', APP),
  151.     65511: ('APP7', 'Application segment 7', APP),
  152.     65512: ('APP8', 'Application segment 8', APP),
  153.     65513: ('APP9', 'Application segment 9', APP),
  154.     65514: ('APP10', 'Application segment 10', APP),
  155.     65515: ('APP11', 'Application segment 11', APP),
  156.     65516: ('APP12', 'Application segment 12', APP),
  157.     65517: ('APP13', 'Application segment 13', APP),
  158.     65518: ('APP14', 'Application segment 14', APP),
  159.     65519: ('APP15', 'Application segment 15', APP),
  160.     65520: ('JPG0', 'Extension 0', None),
  161.     65521: ('JPG1', 'Extension 1', None),
  162.     65522: ('JPG2', 'Extension 2', None),
  163.     65523: ('JPG3', 'Extension 3', None),
  164.     65524: ('JPG4', 'Extension 4', None),
  165.     65525: ('JPG5', 'Extension 5', None),
  166.     65526: ('JPG6', 'Extension 6', None),
  167.     65527: ('JPG7', 'Extension 7', None),
  168.     65528: ('JPG8', 'Extension 8', None),
  169.     65529: ('JPG9', 'Extension 9', None),
  170.     65530: ('JPG10', 'Extension 10', None),
  171.     65531: ('JPG11', 'Extension 11', None),
  172.     65532: ('JPG12', 'Extension 12', None),
  173.     65533: ('JPG13', 'Extension 13', None),
  174.     65534: ('COM', 'Comment', COM) }
  175.  
  176. def _accept(prefix):
  177.     return prefix[0] == '\xff'
  178.  
  179.  
  180. class JpegImageFile(ImageFile.ImageFile):
  181.     format = 'JPEG'
  182.     format_description = 'JPEG (ISO 10918)'
  183.     
  184.     def _open(self):
  185.         s = self.fp.read(1)
  186.         if ord(s[0]) != 255:
  187.             raise SyntaxError('not a JPEG file')
  188.         
  189.         self.bits = self.layers = 0
  190.         self.layer = []
  191.         self.huffman_dc = { }
  192.         self.huffman_ac = { }
  193.         self.quantization = { }
  194.         self.app = { }
  195.         self.applist = []
  196.         while None:
  197.             s = s + self.fp.read(1)
  198.             i = i16(s)
  199.             if MARKER.has_key(i):
  200.                 (name, description, handler) = MARKER[i]
  201.                 if handler is not None:
  202.                     handler(self, i)
  203.                 
  204.                 if i == 65498:
  205.                     rawmode = self.mode
  206.                     if self.mode == 'CMYK' and self.info.has_key('adobe'):
  207.                         rawmode = 'CMYK;I'
  208.                     
  209.                     self.tile = [
  210.                         ('jpeg', (0, 0) + self.size, 0, (rawmode, ''))]
  211.                     break
  212.                 
  213.                 s = self.fp.read(1)
  214.                 continue
  215.             if i == 0 or i == 65535:
  216.                 s = '\xff'
  217.                 continue
  218.             raise SyntaxError('no marker found')
  219.  
  220.     
  221.     def draft(self, mode, size):
  222.         if len(self.tile) != 1:
  223.             return None
  224.         
  225.         (d, e, o, a) = self.tile[0]
  226.         scale = 0
  227.         if a[0] == 'RGB' and mode in [
  228.             'L',
  229.             'YCbCr']:
  230.             self.mode = mode
  231.             a = (mode, '')
  232.         
  233.         if size:
  234.             scale = max(self.size[0] / size[0], self.size[1] / size[1])
  235.             for s in [
  236.                 8,
  237.                 4,
  238.                 2,
  239.                 1]:
  240.                 if scale >= s:
  241.                     break
  242.                     continue
  243.             
  244.             e = (e[0], e[1], ((e[2] - e[0]) + s - 1) / s + e[0], ((e[3] - e[1]) + s - 1) / s + e[1])
  245.             self.size = ((self.size[0] + s - 1) / s, (self.size[1] + s - 1) / s)
  246.             scale = s
  247.         
  248.         self.tile = [
  249.             (d, e, o, a)]
  250.         self.decoderconfig = (scale, 1)
  251.         return self
  252.  
  253.     
  254.     def load_djpeg(self):
  255.         import tempfile
  256.         import os
  257.         file = tempfile.mktemp()
  258.         os.system('djpeg %s >%s' % (self.filename, file))
  259.         
  260.         try:
  261.             self.im = Image.core.open_ppm(file)
  262.         finally:
  263.             
  264.             try:
  265.                 os.unlink(file)
  266.             except:
  267.                 pass
  268.  
  269.  
  270.         self.mode = self.im.mode
  271.         self.size = self.im.size
  272.         self.tile = []
  273.  
  274.     
  275.     def _getexif(self):
  276.         import TiffImagePlugin
  277.         import StringIO
  278.         
  279.         def fixup(value):
  280.             if len(value) == 1:
  281.                 return value[0]
  282.             
  283.             return value
  284.  
  285.         
  286.         try:
  287.             data = self.info['exif']
  288.         except KeyError:
  289.             return None
  290.  
  291.         file = StringIO.StringIO(data[6:])
  292.         head = file.read(8)
  293.         exif = { }
  294.         info = TiffImagePlugin.ImageFileDirectory(head)
  295.         info.load(file)
  296.         for key, value in info.items():
  297.             exif[key] = fixup(value)
  298.         
  299.         file.seek(exif[34665])
  300.         info = TiffImagePlugin.ImageFileDirectory(head)
  301.         info.load(file)
  302.         for key, value in info.items():
  303.             exif[key] = fixup(value)
  304.         
  305.         
  306.         try:
  307.             file.seek(exif[34853])
  308.         except KeyError:
  309.             pass
  310.  
  311.         info = TiffImagePlugin.ImageFileDirectory(head)
  312.         info.load(file)
  313.         exif[34853] = gps = { }
  314.         for key, value in info.items():
  315.             gps[key] = fixup(value)
  316.         
  317.         return exif
  318.  
  319.  
  320. RAWMODE = {
  321.     '1': 'L',
  322.     'L': 'L',
  323.     'RGB': 'RGB',
  324.     'RGBA': 'RGB',
  325.     'RGBX': 'RGB',
  326.     'CMYK': 'CMYK',
  327.     'YCbCr': 'YCbCr' }
  328.  
  329. def _save(im, fp, filename):
  330.     
  331.     try:
  332.         rawmode = RAWMODE[im.mode]
  333.     except KeyError:
  334.         raise IOError('cannot write mode %s as JPEG' % im.mode)
  335.  
  336.     info = im.encoderinfo
  337.     dpi = info.get('dpi', (0, 0))
  338.     if not info.has_key('progressive'):
  339.         pass
  340.     im.encoderconfig = (info.get('quality', 0), info.has_key('progression'), info.get('smooth', 0), info.has_key('optimize'), info.get('streamtype', 0), dpi[0], dpi[1])
  341.     ImageFile._save(im, fp, [
  342.         ('jpeg', (0, 0) + im.size, 0, rawmode)])
  343.  
  344.  
  345. def _save_cjpeg(im, fp, filename):
  346.     import os
  347.     file = im._dump()
  348.     os.system('cjpeg %s >%s' % (file, filename))
  349.     
  350.     try:
  351.         os.unlink(file)
  352.     except:
  353.         pass
  354.  
  355.  
  356. Image.register_open('JPEG', JpegImageFile, _accept)
  357. Image.register_save('JPEG', _save)
  358. Image.register_extension('JPEG', '.jfif')
  359. Image.register_extension('JPEG', '.jpe')
  360. Image.register_extension('JPEG', '.jpg')
  361. Image.register_extension('JPEG', '.jpeg')
  362. Image.register_mime('JPEG', 'image/jpeg')
  363.